dbt_project.ymlに出てくる+のプリフィクスは何なのか
はじめに
データアナリティクス事業本部のおざわです。
いろいろなプロジェクトのdbt_project.yml
を見ていると+materialized
だったかと思えば、別の記事ではmaterialized
だったりします。+
が付いていたりいなかったり、このプリフィクスは何なのか調べてみたので共有します。
公式のドキュメントはこちらです。
結論
結論からお伝えすると、+
のプリフィクスは次の2つの場合に使用します。
- dbtの設定とパスを区別するとき
- persist_docsやgrantsなど辞書型の入力を設定をするとき
1. dbtの設定とパスを区別するとき
dbtではモデルが格納されているリソースパス(フォルダ)をyamlファイルに書いておくと、配下のモデルにまとめて同じ設定を適用してくれます。下の例では、martsフォルダの配下にあるモデルの共通設定として、マテリアライズにtableを設定しています。
name: jaffle_shop config-version: 2 ... models: jaffle_shop: marts: +materialized: table
リソースパスは上のような形で指定できました。
ここでプロジェクト内のtags
フォルダをリソースパスに設定したいとします。dbtにはtagという機能があり、yamlファイル上ではtags
のキーで設定します。どちらもそのまま書いてしまうと、「設定としてのtags」なのか「パスとしてのtags」か区別が難しくなります。
こんなときに設定としてのtags
には+
プリフィクスを付けて+tags
とし、リソースパスとしてのtags
は何も付けずに記載します。
name: jaffle_shop config-version: 2 ... models: jaffle_shop: schema: my_schema +tags: # 設定としてのtags - "hello" tags: # リソースパスとしてのtags materialized: view
プリフィクスなしだとどうなるのか
試しにtagsというフォルダにモデルを作ってから、tagの設定もしてみましたが、特にエラーや警告は発生せず、tagの設定も問題なくできました。リソースパスとの区別に関しては、やっておいたほうがいいくらいの温度感なのかもしれません。ドキュメントでも「特に害はないので+
のプリフィクスを付けておく」が推奨とされています。
When adding configs in
dbt_project.yml
, it doesn't hurt to use the+
prefix, so we recommend you use it always.
2. 辞書型の入力を設定をするとき
dbtの設定には、persist_docsやgrantsのようにマッピング(辞書)の入力を受け取る設定があります。これらの設定に対しては+
が必要になります。
persist_docsについてはこちらのブログで紹介していますのでご確認ください。
プリフィクスなしだとどうなるか
persist_docsを以下のように+
なしで設定してみました。
name: jaffle_shop config-version: 2 ... models: persist_docs: relation: true columns: true
+
プリフィクスなしだとリソースパスとして読み込もうとしますが、パスが存在しないため警告が出ます。この場合はpersist_docsも有効になりませんので、descriptionは永続化されませんでした。
05:31:28 [WARNING]: Configuration paths exist in your dbt_project.yml file which do not apply to any resources. There are 1 unused configuration paths: - models.persist_docs
おわりに
以上、簡単ですがdbtの設定ファイルにある+
プリフィクスに関して調べたことの共有でした。